#ifndef __ETH_RX_REGS_H__
#define __ETH_RX_REGS_H__

#include <io.h>

/// \defgroup ETH_RX_REGS Регистры управления и статуса
/// \brief Адресное пространство модуля
/// @{
    /// \name Control and status registers (CSR)
    /// @{
#define ETH_RX_STATUS_REG           0       ///< \sa \ref ETH_RX_STATUS_REG
#define ETH_RX_CTRL_REG             1       ///< \sa \ref ETH_RX_CTRL_REG
#define ETH_RX_FRAMESZ_REG          2
#define ETH_RX_BLOCKADDR_REG        3
    /// @}

    /// \defgroup ETH_RX_STATUS_REG Регистр статуса 
    /// \brief Содержит флаги состояния модуля
    /// @{
        /// \name Функции доступа к регистру статуса
        /// @{
        #define IOADDR_ETH_RX_STATUS(base) \
            __IO_CALC_ADDRESS_NATIVE(base, ETH_RX_STATUS_REG)
        #define IORD_ETH_RX_STATUS(base) \
            IORD(base, ETH_RX_STATUS_REG) 
        /// @}

        /// \name Битовые обращения к регистру статуса
        /// @{
        #define ETH_RX_STATUS_EMPTY_MSK                  0x00000001
        #define ETH_RX_STATUS_EMPTY_OFST                 0
        #define ETH_RX_STATUS_FULL_MSK                   0x00000002
        #define ETH_RX_STATUS_FULL_OFST                  1
        /// @}
    /// @}

    /// \defgroup ETH_RX_CTRL_REG Регистр управления
    /// \brief Предназначен для управления модулем
    /// @{
        /// \name Функции доступа к регистру управления
        /// @{
        #define IOADDR_ETH_RX_CTRL(base) \
            __IO_CALC_ADDRESS_NATIVE(base, ETH_RX_CTRL_REG)
        #define IORD_ETH_RX_CTRL(base) \
            IORD(base, ETH_RX_CTRL_REG) 
        #define IOWR_ETH_RX_CTRL(base, data) \
            IOWR(base, ETH_RX_CTRL_REG, data)
        /// @}

        /// \name Битовые обращения к регистру управления
        /// @{
        #define ETH_RX_CTRL_CMD_MSK                     0x0000000F
        #define ETH_RX_CTRL_CMD_OFST                    0
        /// @}        
    /// @}

    /// \defgroup ETH_RX_FRAMESZ_REG Регистр размера текущего пакета
    /// \brief Передает размер текущего пакета в очереди
    /// @{
        /// \name Функции доступа к регистру размера текущего пакета 
        /// @{
        #define IOADDR_ETH_RX_FRAMESZ(base) \
            __IO_CALC_ADDRESS_NATIVE(base, ETH_RX_FRAMESZ_REG)
        #define IORD_ETH_RX_FRAMESZ(base) \
            IORD(base, ETH_RX_FRAMESZ_REG) 
        /// @}

        /// \name Битовые обращения к регистру размера текущего пакета
        /// @{
        #define ETH_RX_FRAMESZ_SIZE_MSK                  0x000003FF
        #define ETH_RX_FRAMESZ_SIZE_OFST                 0
        /// @}        
    /// @}
    
    /// \defgroup ETH_RX_BLOCKADDR_REG Регистр адреса текущего блока данных
    /// \brief Передает адрес текущего блока, из которого следует читать данные пакета
    /// @{
        /// \name Функции доступа к регистру адреса текущего блока данных
        /// @{
        #define IOADDR_ETH_RX_BLOCKADDR(base) \
            __IO_CALC_ADDRESS_NATIVE(base, ETH_RX_BLOCKADDR_REG)
        #define IORD_ETH_RX_BLOCKADDR(base) \
            IORD(base, ETH_RX_BLOCKADDR_REG) 
        /// @}

        /// \name Битовые обращения к регистру адреса текущего блока данных
        /// @{
        #define ETH_RX_BLOCKADDR_ADDR_MSK                  0xFFFFFFFF
        #define ETH_RX_BLOCKADDR_ADDR_OFST                 0
        /// @}        
    /// @}
    
/// @}

/// @}
#endif /* __ETH_RX_REGS_H__ */
